# 指定源文件目录
SRC_DIR := src
# 指定目标文件目录
OBJ_DIR := obj
# 测试文件目录
TEST_DIR := ../test

# 获取 src 目录下所有的 .cc 文件
SRCS := $(wildcard $(SRC_DIR)/*.cc)
# 将 src 目录下的 .cc 文件替换为 obj 目录下的 .o 文件
OBJS := $(patsubst $(SRC_DIR)/%.cc, $(OBJ_DIR)/%.o, $(SRCS))

# 测试文件配置
TEST_SRCS := $(wildcard $(TEST_DIR)/*.cc)
TEST_OBJS := $(patsubst $(TEST_DIR)/%.cc, $(OBJ_DIR)/test_%.o, $(TEST_SRCS))
TEST_EXE := test_mysql

# 排除包含main函数的对象文件
MAIN_OBJS := $(OBJ_DIR)/TestServer.o
OBJS_WITHOUT_MAIN := $(filter-out $(MAIN_OBJS), $(OBJS))

CC := g++
EXE := server.exe
FLAGS := -g -I./include -I$(TEST_DIR)
# 添加log4cpp库和pthread库的链接选项
LDFLAGS := -llog4cpp -lpthread -lcrypt -lmysqlclient -lcrypto -lssl

# 创建 obj 目录（如果不存在）
$(shell mkdir -p $(OBJ_DIR))

# 默认目标 - 编译主程序
all: $(EXE)

# 主程序目标
$(EXE): $(OBJS)
	$(CC) -o $@ $^ $(FLAGS) $(LDFLAGS)
	@echo "主程序编译完成: ./$(EXE)"

# 测试程序目标
test: $(TEST_EXE)

$(TEST_EXE): $(TEST_OBJS) $(OBJS_WITHOUT_MAIN)
	$(CC) -o $@ $^ $(FLAGS) $(LDFLAGS)
	@echo "测试程序编译完成: ./$(TEST_EXE)"

# 编译主程序的 .o 文件
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cc
	$(CC) -c $< -o $@ $(FLAGS)

# 编译测试程序的 .o 文件
$(OBJ_DIR)/test_%.o: $(TEST_DIR)/%.cc
	$(CC) -c $< -o $@ $(FLAGS)

# 清理目标
clean:
	rm -rf $(OBJ_DIR) $(EXE) $(TEST_EXE) $(TEST_OBJS)
	@echo "已清理所有编译文件"

# 仅清理测试文件
clean_test:
	rm -f $(TEST_EXE) $(TEST_OBJS)
	@echo "已清理测试文件"

# 显示文件信息
echo:
	@echo "=== 文件信息 ==="
	@echo "主程序源文件: $(SRCS)"
	@echo "主程序目标文件: $(OBJS)"
	@echo "测试源文件: $(TEST_SRCS)"
	@echo "测试目标文件: $(TEST_OBJS)"
	@echo "排除main后的目标文件: $(OBJS_WITHOUT_MAIN)"

# 显示帮助信息
help:
	@echo "=== Makefile 使用说明 ==="
	@echo "make all     - 编译主程序 (默认)"
	@echo "make         - 同 make all"
	@echo "make test    - 编译测试程序"
	@echo "make clean   - 清理所有编译文件"
	@echo "make clean_test - 仅清理测试文件"
	@echo "make echo    - 显示文件信息"
	@echo "make help    - 显示此帮助信息"

.PHONY: all test clean clean_test echo help

























































